BrOffice.org é um conhecido pacote de automação de escritórios de código aberto, que inclui editor de textos, planilha e outros aplicativos. Além disso, o BrOffice.org também suporta Python (entre outras linguagens):
Exemplo de macro:
In [ ]:
# A macro deve ser executada a partir do
# BrOffice.org Calc
def plan():
"""
Preenche uma planilha
"""
# Obtêm o documento para o contexto de script
doc = XSCRIPTCONTEXT.getDocument()
# A primeira planilha do documento
sheet = doc.getSheets().getByIndex(0)
col = lin = 0
a = ord('A')
# Cria uma linha com os títulos para as colunas
for titulo in ('Jan', 'Fev', 'Mar', 'Total'):
col += 1
sheet.getCellByPosition(col, lin).setString(titulo)
# E coloca uma fórmula com somatório na última linha
coluna = chr(a + col)
formula = '=SUM(%s2:%s6)' % (coluna, coluna)
sheet.getCellByPosition(col, lin + 6).setFormula(formula)
for lin in xrange(1, 6):
# Numera as linhas
sheet.getCellByPosition(0, lin).setValue(lin)
# Coloca somatórios no fim de cada linha
formula = '=SUM(B%d:D%d)' % (lin + 1, lin + 1)
sheet.getCellByPosition(4, lin).setFormula(formula)
# Preenche os dados
for col in (1, 2, 3):
sheet.getCellByPosition(col, lin).setFormula('=10*RAND()')
# Substitui a fórmula pelo valor
val = sheet.getCellByPosition(col, lin).getValue()
sheet.getCellByPosition(col, lin).setValue(val)
return None
Saída:
Para que o BrOffice.org possa identificar o script escrito em Python como um arquivo de macro, ele precisa estar na pasta para scripts em Python, que no Windows fica em Basis\share\Scripts\python, dentro da pasta de instalação do BrOffice.org.
Exemplo de geração de relatório em PDF através do editor de texto (Writer), através da Python UNO Bridge:
In [ ]:
# Para iniciar o BrOffice.org como servidor:
# swriter.exe -headless
# "-accept=pipe,name=py;urp;StarOffice.ServiceManager"
import os
import uno
from com.sun.star.beans import PropertyValue
# Dados...
mus = [('Artista', 'Faixa'),
('King Crimson', 'Starless'), ('Yes', 'Siberian Khatru'),
('Led Zeppellin', 'No Quarter'), ('Genesis', 'Supper\'s Ready')]
# Obtêm o número e o tamanho dos registros
rows = len(mus)
cols = len(mus[0])
# Inicio do "Boiler Plate"...
# Contexto de componente local
loc = uno.getComponentContext()
# Para resolver URLs
res = loc.ServiceManager.createInstanceWithContext(
'com.sun.star.bridge.UnoUrlResolver', loc)
# Contexto para a URL
con = res.resolve('uno:pipe,name=py;urp;StarOffice.ComponentContext')
# Documento corrente
desktop = con.ServiceManager.createInstanceWithContext(
'com.sun.star.frame.Desktop', con)
# Fim do "Boiler Plate"...
# Cria um documento novo no Writer
doc = desktop.loadComponentFromURL('private:factory/swriter',
'_blank', 0, ())
# Cursor de texto
cursor = doc.Text.createTextCursor()
# Muda as propriedades do texto
cursor.setPropertyValue('CharFontName', 'Verdana')
cursor.setPropertyValue('CharHeight', 20)
cursor.setPropertyValue('CharWeight', 180)
# Insere o texto no documento
doc.Text.insertString(cursor, 'Músicas favoritas\n', 0)
# Cria tabela
tab = doc.createInstance('com.sun.star.text.TextTable')
tab.initialize(rows, cols)
doc.Text.insertTextContent(cursor, tab, 0)
# Preenche a tabela
for row in xrange(rows):
for col in xrange(cols):
cel = chr(ord('A') + col) + str(row + 1)
tab.getCellByName(cel).setString(mus[row][col])
# Propriedades para exportar o documento
props = []
p = PropertyValue()
p.Name = 'Overwrite'
p.Value = True # Sobrescreve o documento anterior
props.append(p)
p = PropertyValue()
p.Name = 'FilterName'
p.Value = 'writer_pdf_Export' # Writer para PDF
props.append(p)
# URL de destino, no qual o arquivo PDF será salvo
url = uno.systemPathToFileUrl(os.path.abspath('musicas.pdf'))
# Salva o documento como PDF
doc.storeToURL(url, tuple(props))
# Fecha o documento
doc.close(True)
Saída (arquivo PDF):
A API do BrOffice.org é bastante completa e simplifica várias atividades que são lugar comum em programas para ambiente desktop.
In [1]:
Out[1]: